// 使用现代C++特性重写的线程类
// 替代原有的muduo Thread类，去除外部依赖

#ifndef MODERN_THREAD_H
#define MODERN_THREAD_H

#include <atomic>
#include <functional>
#include <memory>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>

#include "CopyPolicy.h"

namespace cytoolkit {
class Thread : NonCopyable
{
public:
    using ThreadFunc = std::function<void()>;

    explicit Thread(ThreadFunc func, const std::string& name = std::string());
    
    Thread(Thread&& other) noexcept;
    Thread& operator=(Thread&& other) noexcept;
    
    ~Thread();

    void start();
    bool join();
    void detach();
    
    bool started() const { return started_; }
    std::thread::id tid() const { return tid_; }
    
    const std::string& name() const { return name_; }
    bool joinable() const { return thread_ && thread_->joinable(); }
    
    // 获取已创建的线程数量
    static int numCreated() { return numCreated_.load(); }
    
    static void usleep(int us);
    static void msleep(int ms); 
    // 获取当前线程ID
    static int threadID(); 

    /** 
     * @brief 设置线程CPU亲和性 
     * @param cpuId CPU序号(0~N) 
     * @return bool 
     * @note 设置进程CPU亲和性请使用System::setAffinity() 
     */ 
    static bool setAffinity(int cpuId); 

    // 设置线程名称
    static void setName(const std::string& name);

private:
    void setDefaultName();
    void runInThread();

private:
    bool started_;                      // 线程是否已启动
    bool joined_;                       // 线程是否已被等待
    std::unique_ptr<std::thread> thread_; 
    std::thread::id tid_;               // 线程ID
    ThreadFunc func_;                   // 线程执行函数
    std::string name_;                  // 线程名称
    
    // 确保线程正确启动
    std::mutex mutex_;
    std::condition_variable cond_;
    bool ready_{false};

    static std::atomic<int> numCreated_; // 已创建线程计数
};
} // namespace cytoolkit
#endif // MODERN_THREAD_H